x86 vmx: Add handlers for missing exit_reasons documented by Intel SDM 3B
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 13 Sep 2010 16:05:45 +0000 (17:05 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 13 Sep 2010 16:05:45 +0000 (17:05 +0100)
Signed-off-by: Liu Yuan <yuan.b.liu@intel.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/hvm/vmx/vmx.c
xen/include/asm-x86/hvm/vmx/vmx.h

index 36cec3f8cc36480783a3cfa22755a94f17cb7d49..ed2bf325f4f8e9738702510b2fcbd82fec8d703e 100644 (file)
@@ -2331,7 +2331,14 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
         case EXIT_REASON_PENDING_VIRT_INTR:
         case EXIT_REASON_PENDING_VIRT_NMI:
         case EXIT_REASON_MCE_DURING_VMENTRY:
+        case EXIT_REASON_GETSEC:
+        case EXIT_REASON_ACCESS_GDTR_OR_IDTR:
+        case EXIT_REASON_ACCESS_LDTR_OR_TR:
+        case EXIT_REASON_VMX_PREEMPTION_TIMER_EXPIRED:
+        case EXIT_REASON_INVEPT:
+        case EXIT_REASON_INVVPID:
             break;
+
         default:
             v->arch.hvm_vmx.vmx_emulate = 1;
             perfc_incr(realmode_exits);
@@ -2582,6 +2589,15 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
     case EXIT_REASON_VMWRITE:
     case EXIT_REASON_VMXOFF:
     case EXIT_REASON_VMXON:
+    case EXIT_REASON_GETSEC:
+    case EXIT_REASON_INVEPT:
+    case EXIT_REASON_INVVPID:
+        /*
+         * We should never exit on GETSEC because CR4.SMXE is always 0 when
+         * running in guest context, and the CPU checks that before getting
+         * as far as vmexit.
+         */
+        WARN_ON(exit_reason == EXIT_REASON_GETSEC);
         vmx_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE);
         break;
 
@@ -2647,6 +2663,10 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
         break;
     }
 
+    case EXIT_REASON_ACCESS_GDTR_OR_IDTR:
+    case EXIT_REASON_ACCESS_LDTR_OR_TR:
+    case EXIT_REASON_VMX_PREEMPTION_TIMER_EXPIRED:
+    /* fall through */
     default:
     exit_and_crash:
         gdprintk(XENLOG_ERR, "Bad vmexit (reason %x)\n", exit_reason);
index 94227f37de5f470a047a407658b443fedf8a185e..471138e62f4aaa2d0360877a410d49621a6e168a 100644 (file)
@@ -77,6 +77,7 @@ void vmx_update_debug_state(struct vcpu *v);
 #define EXIT_REASON_PENDING_VIRT_NMI    8
 #define EXIT_REASON_TASK_SWITCH         9
 #define EXIT_REASON_CPUID               10
+#define EXIT_REASON_GETSEC              11
 #define EXIT_REASON_HLT                 12
 #define EXIT_REASON_INVD                13
 #define EXIT_REASON_INVLPG              14
@@ -107,9 +108,14 @@ void vmx_update_debug_state(struct vcpu *v);
 #define EXIT_REASON_MCE_DURING_VMENTRY  41
 #define EXIT_REASON_TPR_BELOW_THRESHOLD 43
 #define EXIT_REASON_APIC_ACCESS         44
+#define EXIT_REASON_ACCESS_GDTR_OR_IDTR 46
+#define EXIT_REASON_ACCESS_LDTR_OR_TR   47
 #define EXIT_REASON_EPT_VIOLATION       48
 #define EXIT_REASON_EPT_MISCONFIG       49
+#define EXIT_REASON_INVEPT              50
 #define EXIT_REASON_RDTSCP              51
+#define EXIT_REASON_VMX_PREEMPTION_TIMER_EXPIRED 52
+#define EXIT_REASON_INVVPID             53
 #define EXIT_REASON_WBINVD              54
 #define EXIT_REASON_XSETBV              55